/* * #%L * Service Locator Client for CXF * %% * Copyright (C) 2011 - 2012 Talend Inc. * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.talend.esb.servicelocator.client; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import javax.xml.transform.Result; import javax.xml.transform.dom.DOMResult; import org.talend.esb.servicelocator.client.ws.addressing.AttributedURIType; import org.talend.esb.servicelocator.client.ws.addressing.EndpointReferenceType; import org.talend.esb.servicelocator.client.ws.addressing.MetadataType; import org.w3c.dom.Document; import org.w3c.dom.Node; public class SimpleEndpoint implements Endpoint { private static final Logger LOG = Logger.getLogger(SimpleEndpoint.class.getName()); private static final org.talend.esb.servicelocator.client.ws.addressing.ObjectFactory WSA_OBJECT_FACTORY = new org.talend.esb.servicelocator.client.ws.addressing.ObjectFactory(); private static volatile JAXBContext jContext; private final QName sName; private String addr; private final BindingType binding; private final TransportType transport; private SLProperties props; public SimpleEndpoint(QName serviceName, String endpoint) { this(serviceName, endpoint, null); } public SimpleEndpoint(QName serviceName, String endpoint, SLProperties properties) { this(serviceName, endpoint, BindingType.SOAP11, TransportType.HTTP, properties); } public SimpleEndpoint(QName serviceName, String endpoint, BindingType bindingType, TransportType transportType, SLProperties properties) { sName = serviceName; addr = endpoint; binding = bindingType; transport = transportType; props = properties; } @Override public BindingType getBinding() { return binding; } @Override public TransportType getTransport() { return transport; } @Override public String getAddress() { return addr; } @Override public SLProperties getProperties() { return props; } public QName forService() { return sName; } @Override public QName getServiceName() { return forService(); } @Override public void writeEndpointReferenceTo(Result result, PropertiesTransformer transformer) throws ServiceLocatorException { EndpointReferenceType epr = createEndpointReference(transformer); try { JAXBElement<EndpointReferenceType> ep = WSA_OBJECT_FACTORY.createEndpointReference(epr); JAXBContext jc = getContext(); jc.createMarshaller().marshal(ep, result); } catch (JAXBException e) { if (LOG.isLoggable(Level.SEVERE)) { LOG.log(Level.SEVERE, "Failed to serialize endpoint data", e); } throw new ServiceLocatorException("Failed to serialize endpoint data", e); } } @Override public void addEndpointReference(Node parent) throws ServiceLocatorException { EndpointReferenceType wsAddr = createEndpointReference(null); try { JAXBElement<EndpointReferenceType> ep = WSA_OBJECT_FACTORY.createEndpointReference(wsAddr); JAXBContext jc = getContext(); jc.createMarshaller().marshal(ep, parent); } catch (JAXBException e) { if (LOG.isLoggable(Level.SEVERE)) { LOG.log(Level.SEVERE, "Failed to serialize endpoint data", e); } throw new ServiceLocatorException("Failed to serialize endpoint data", e); } } protected void init(String endpoint, SLProperties properties) { addr = endpoint; props = properties; } private EndpointReferenceType createEndpointReference(PropertiesTransformer transformer) { AttributedURIType endpoint = new AttributedURIType(); endpoint.setValue(addr); EndpointReferenceType epr = new EndpointReferenceType(); epr.setAddress(endpoint); if (props != null) { DOMResult result = new DOMResult(); transformer.writePropertiesTo(props, result); Document docResult = (Document)result.getNode(); MetadataType metadata = new MetadataType(); epr.setMetadata(metadata); metadata.getAny().add(docResult.getDocumentElement()); } return epr; } private static JAXBContext getContext() throws JAXBException{ if (jContext == null) { jContext = JAXBContext.newInstance( "org.talend.esb.servicelocator.client.ws.addressing:" + "org.talend.esb.servicelocator.client.internal.endpoint", SimpleEndpoint.class.getClassLoader()); } return jContext; } }